package com.school.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.school.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;

/**
 * 用户Mapper接口
 * 
 * @author School Development Team
 * @version 1.0.0
 * @since 2024
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名
     * @return 用户信息
     */
    @Select("SELECT * FROM users WHERE username = #{username} AND status != 'inactive'")
    User findByUsername(@Param("username") String username);

    /**
     * 根据用户名查询用户（调试用）
     * 
     * @param username 用户名
     * @return 用户信息
     */
    @Select("SELECT * FROM users WHERE username = #{username}")
    User findByUsernameDebug(@Param("username") String username);

    /**
     * 根据用户名和状态查询用户
     * 
     * @param username 用户名
     * @param status 状态
     * @return 用户信息
     */
    @Select("SELECT * FROM users WHERE username = #{username} AND status = #{status}")
    User findByUsernameAndStatus(@Param("username") String username, @Param("status") String status);

    /**
     * 根据邮箱查询用户
     * 
     * @param email 邮箱
     * @return 用户信息
     */
    @Select("SELECT * FROM users WHERE email = #{email} AND status != 'inactive'")
    User findByEmail(@Param("email") String email);

    /**
     * 根据手机号查询用户
     * 
     * @param phone 手机号
     * @return 用户信息
     */
    @Select("SELECT * FROM users WHERE phone = #{phone} AND status != 'inactive'")
    User findByPhone(@Param("phone") String phone);

    /**
     * 根据关联ID查询用户
     * 
     * @param relatedId 关联ID
     * @return 用户信息
     */
    @Select("SELECT * FROM users WHERE related_id = #{relatedId} AND status != 'inactive'")
    User findByRelatedId(@Param("relatedId") String relatedId);

    /**
     * 检查用户名是否存在
     * 
     * @param username 用户名
     * @return 是否存在
     */
    @Select("SELECT COUNT(*) > 0 FROM users WHERE username = #{username}")
    boolean existsByUsername(@Param("username") String username);

    /**
     * 检查邮箱是否存在
     * 
     * @param email 邮箱
     * @return 是否存在
     */
    @Select("SELECT COUNT(*) > 0 FROM users WHERE email = #{email}")
    boolean existsByEmail(@Param("email") String email);

    /**
     * 检查手机号是否存在
     * 
     * @param phone 手机号
     * @return 是否存在
     */
    @Select("SELECT COUNT(*) > 0 FROM users WHERE phone = #{phone}")
    boolean existsByPhone(@Param("phone") String phone);

    /**
     * 更新最后登录时间和登录次数
     * 
     * @param userId 用户ID
     * @param lastLoginTime 最后登录时间
     * @param loginCount 登录次数
     * @return 更新行数
     */
    @Update("UPDATE users SET last_login_time = #{lastLoginTime}, login_count = #{loginCount}, " +
            "updated_at = CURRENT_TIMESTAMP WHERE user_id = #{userId}")
    int updateLoginInfo(@Param("userId") String userId, 
                       @Param("lastLoginTime") LocalDateTime lastLoginTime, 
                       @Param("loginCount") Integer loginCount);

    /**
     * 更新用户状态
     * 
     * @param userId 用户ID
     * @param status 状态
     * @return 更新行数
     */
    @Update("UPDATE users SET status = #{status}, updated_at = CURRENT_TIMESTAMP WHERE user_id = #{userId}")
    int updateUserStatus(@Param("userId") String userId, @Param("status") String status);

    /**
     * 更新用户密码
     * 
     * @param userId 用户ID
     * @param passwordHash 新密码哈希
     * @return 更新行数
     */
    @Update("UPDATE users SET password_hash = #{passwordHash}, updated_at = CURRENT_TIMESTAMP WHERE user_id = #{userId}")
    int updatePassword(@Param("userId") String userId, @Param("passwordHash") String passwordHash);

    /**
     * 锁定用户账户
     * 
     * @param userId 用户ID
     * @return 更新行数
     */
    @Update("UPDATE users SET status = 'locked', updated_at = CURRENT_TIMESTAMP WHERE user_id = #{userId}")
    int lockUser(@Param("userId") String userId);

    /**
     * 解锁用户账户
     * 
     * @param userId 用户ID
     * @return 更新行数
     */
    @Update("UPDATE users SET status = 'active', updated_at = CURRENT_TIMESTAMP WHERE user_id = #{userId}")
    int unlockUser(@Param("userId") String userId);

    /**
     * 根据用户类型统计用户数量
     * 
     * @param userType 用户类型
     * @return 用户数量
     */
    @Select("SELECT COUNT(*) FROM users WHERE user_type = #{userType} AND status != 'inactive'")
    long countByUserType(@Param("userType") String userType);

    /**
     * 根据状态统计用户数量
     * 
     * @param status 状态
     * @return 用户数量
     */
    @Select("SELECT COUNT(*) FROM users WHERE status = #{status}")
    long countByStatus(@Param("status") String status);
}